<?php
// +----------------------------------------------------------------------
// | TOPThink [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2010 http://topthink.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
// | ThinkImage.class.php 2013-03-05
// +----------------------------------------------------------------------
namespace Think;

/**
 * 图片处理驱动类，可配置图片处理库
 * 目前支持GD库和imagick
 * 
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
class Image {
	/* 驱动相关常量定义 */
	const IMAGE_GD = 1; // 常量，标识GD库类型
	const IMAGE_IMAGICK = 2; // 常量，标识imagick库类型
	
	/* 缩略图相关常量定义 */
	const IMAGE_THUMB_SCALE = 1; // 常量，标识缩略图等比例缩放类型
	const IMAGE_THUMB_FILLED = 2; // 常量，标识缩略图缩放后填充类型
	const IMAGE_THUMB_CENTER = 3; // 常量，标识缩略图居中裁剪类型
	const IMAGE_THUMB_NORTHWEST = 4; // 常量，标识缩略图左上角裁剪类型
	const IMAGE_THUMB_SOUTHEAST = 5; // 常量，标识缩略图右下角裁剪类型
	const IMAGE_THUMB_FIXED = 6; // 常量，标识缩略图固定尺寸缩放类型
	
	/* 水印相关常量定义 */
	const IMAGE_WATER_NORTHWEST = 1; // 常量，标识左上角水印
	const IMAGE_WATER_NORTH = 2; // 常量，标识上居中水印
	const IMAGE_WATER_NORTHEAST = 3; // 常量，标识右上角水印
	const IMAGE_WATER_WEST = 4; // 常量，标识左居中水印
	const IMAGE_WATER_CENTER = 5; // 常量，标识居中水印
	const IMAGE_WATER_EAST = 6; // 常量，标识右居中水印
	const IMAGE_WATER_SOUTHWEST = 7; // 常量，标识左下角水印
	const IMAGE_WATER_SOUTH = 8; // 常量，标识下居中水印
	const IMAGE_WATER_SOUTHEAST = 9; // 常量，标识右下角水印
	
	/**
	 * 图片资源
	 * 
	 * @var resource
	 */
	private $img;
	
	/**
	 * 构造方法，用于实例化一个图片处理对象
	 * 
	 * @param string $type
	 *        	要使用的类库，默认使用GD库
	 */
	public function __construct($type = self::IMAGE_GD, $imgname = null) {
		/* 判断调用库的类型 */
		switch ($type) {
			case self::IMAGE_GD :
				$class = 'Gd';
				break;
			case self::IMAGE_IMAGICK :
				$class = 'Imagick';
				break;
			default :
				E ( '不支持的图片处理库类型' );
		}
		
		/* 引入处理库，实例化图片处理对象 */
		$class = "Think\\Image\\Driver\\{$class}";
		$this->img = new $class ( $imgname );
	}
	
	/**
	 * 打开一幅图像
	 * 
	 * @param string $imgname
	 *        	图片路径
	 * @return Object 当前图片处理库对象
	 */
	public function open($imgname) {
		$this->img->open ( $imgname );
		return $this;
	}
	
	/**
	 * 保存图片
	 * 
	 * @param string $imgname
	 *        	图片保存名称
	 * @param string $type
	 *        	图片类型
	 * @param integer $quality
	 *        	图像质量
	 * @param boolean $interlace
	 *        	是否对JPEG类型图片设置隔行扫描
	 * @return Object 当前图片处理库对象
	 */
	public function save($imgname, $type = null, $quality = 80, $interlace = true) {
		$this->img->save ( $imgname, $type, $quality, $interlace );
		return $this;
	}
	
	/**
	 * 返回图片宽度
	 * 
	 * @return integer 图片宽度
	 */
	public function width() {
		return $this->img->width ();
	}
	
	/**
	 * 返回图片高度
	 * 
	 * @return integer 图片高度
	 */
	public function height() {
		return $this->img->height ();
	}
	
	/**
	 * 返回图像类型
	 * 
	 * @return string 图片类型
	 */
	public function type() {
		return $this->img->type ();
	}
	
	/**
	 * 返回图像MIME类型
	 * 
	 * @return string 图像MIME类型
	 */
	public function mime() {
		return $this->img->mime ();
	}
	
	/**
	 * 返回图像尺寸数组 0 - 图片宽度，1 - 图片高度
	 * 
	 * @return array 图片尺寸
	 */
	public function size() {
		return $this->img->size ();
	}
	
	/**
	 * 裁剪图片
	 * 
	 * @param integer $w
	 *        	裁剪区域宽度
	 * @param integer $h
	 *        	裁剪区域高度
	 * @param integer $x
	 *        	裁剪区域x坐标
	 * @param integer $y
	 *        	裁剪区域y坐标
	 * @param integer $width
	 *        	图片保存宽度
	 * @param integer $height
	 *        	图片保存高度
	 * @return Object 当前图片处理库对象
	 */
	public function crop($w, $h, $x = 0, $y = 0, $width = null, $height = null) {
		$this->img->crop ( $w, $h, $x, $y, $width, $height );
		return $this;
	}
	
	/**
	 * 生成缩略图
	 * 
	 * @param integer $width
	 *        	缩略图最大宽度
	 * @param integer $height
	 *        	缩略图最大高度
	 * @param integer $type
	 *        	缩略图裁剪类型
	 * @return Object 当前图片处理库对象
	 */
	public function thumb($width, $height, $type = self::IMAGE_THUMB_SCALE) {
		$this->img->thumb ( $width, $height, $type );
		return $this;
	}
	
	/**
	 * 添加水印
	 * 
	 * @param string $source
	 *        	水印图片路径
	 * @param integer $locate
	 *        	水印位置
	 * @param integer $alpha
	 *        	水印透明度
	 * @return Object 当前图片处理库对象
	 */
	public function water($source, $locate = self::IMAGE_WATER_SOUTHEAST, $alpha = 80) {
		$this->img->water ( $source, $locate, $alpha );
		return $this;
	}
	
	/**
	 * 图像添加文字
	 * 
	 * @param string $text
	 *        	添加的文字
	 * @param string $font
	 *        	字体路径
	 * @param integer $size
	 *        	字号
	 * @param string $color
	 *        	文字颜色
	 * @param integer $locate
	 *        	文字写入位置
	 * @param integer $offset
	 *        	文字相对当前位置的偏移量
	 * @param integer $angle
	 *        	文字倾斜角度
	 * @return Object 当前图片处理库对象
	 */
	public function text($text, $font, $size, $color = '#00000000', $locate = self::IMAGE_WATER_SOUTHEAST, $offset = 0, $angle = 0) {
		$this->img->text ( $text, $font, $size, $color, $locate, $offset, $angle );
		return $this;
	}
}